// 导包
const fs = require('fs');
const path = require('path');

const sendEmail = require('./sendEmail.js');
// 生成邮件ID
const { v4: uuidv4 } = require('uuid');
// 导入已封装的数据函数
const db = require('../config/db.js');
const PROJECT_NAME = 'MC旅游平台';
const FROM_EMAIL = '1217245503@qq.com';//开发者邮箱

// 储存验证码的方案：
// 1: 写入.txt文件
// 2: 储存在数据库(推荐)
// 3: 使用nodejs储存机制
class Email {
    static delay = null;
    // 发送邮件
    static async getEmailCode(client_email) {
        // 生成验证码
        // let emailCode = Math.random().toString().slice(-6);
        let emailCode = Math.random().toString().slice(-4);//四位随机数
        // id
        let code_id = uuidv4();
        //随机生成6位数字
        let email = {
            title: 'MC旅游平台---邮箱验证码',
            body: `
                    <h1>您好：</h1>
                    <p style="font-size: 18px;color:#000;">
                        您的验证码为：
                        <span style="font-size: 16px;color:#f00;"><b>${emailCode}</b>,</span>
                        <p>您当前正在${PROJECT_NAME}注册账号，验证码告知他人将会导致数据信息被盗，请勿泄露!</p>
                    </p>
                    <p style="font-size: 1.5rem;color:#999;">120秒内有效</p>
                    <script>
                           console.log('test')
                    </script>
                    `
        }
        let emailCotent = {
            from: FROM_EMAIL, // 发件人地址
            to: `${client_email}`, // 收件人地址，多个收件人可以使用逗号分隔
            subject: email.title, // 邮件标题
            html: email.body // 邮件内容
        };
        // 发送邮件
        await sendEmail.send(emailCotent);
        // 345234523@qq.com
        //把验证码储存数据库
        Email.writeEmailCode(client_email,emailCode,code_id)
        .then(
            data=>{
                console.log(data)
                if(Email.delay != null) {
                    clearTimeout(Email.delay);
                    return;
                }
                // 120秒之后删除验证码
                Email.delay = setTimeout(()=>{
                    Email.removeEmailCode(client_email).then(
                        ()=>{
                            // console.log('验证码已删除')
                        }
                    )
                    clearTimeout(Email.delay);
                },120 * 1000)
            }
        )
        .catch(
            err=> {
                console.log(err);
            }
        )
    }
    // 添加验证码
    static async writeEmailCode(client_email,emailCode,code_id){
        return new Promise((resolve,reject)=>{
            // 执行插入数据的sql语句
            let sql = `insert into c_code(user_acc,code_val,code_id) values('${client_email}','${emailCode}','${code_id}')`;
            db.query(sql)
            .then(
                rows=>{
                    resolve({
                        code: 200,
                        msg: '添加验证码成功。'
                    })
                }
            )
            .catch(
                err=>{
                    reject({
                        code: -1,
                        msg: '添加验证码失败。',
                        err 
                    })
                }
            )
        })
    }
    // 删除验证码
    static async removeEmailCode(client_email){
        return new Promise((resolve,reject)=>{
            // 执行删除数据的sql语句
            let sql = `delete from c_code where user_acc = '${client_email}'`;
            db.query(sql)
            .then(
                rows=>{
                    resolve({
                        code: 200,
                        msg: '删除验证码成功。'
                    })
                }
            )
            .catch(
                err=>{
                    resolve({
                        code: -1,
                        msg: '删除验证码失败。',
                        err 
                    })
                }
                
            )
        })
    }
    // 判断邮箱的验证码是否是过期(是否有该验证码)
    static async verifyEmailCode(client_email,code){
         // 判断邮箱和验证码是否匹配
         return new Promise((resolve,reject)=>{
            // 执行查询数据的sql语句
            let sql = `select user_acc from c_code where user_acc = '${client_email}' and code_val='${code}'`;
            db.query(sql)
            .then(
                rows=>{
                    if(rows.length == 1){
                        resolve({
                            code: 200,
                            msg: '邮箱验证成功。'
                        })
                    }
                    else {
                        resolve({
                            code: -1,
                            msg: '邮箱验证失败。'
                        })
                    }
                }
            )
            .catch(
                err=>{
                    reject({
                        code: -1,
                        msg: '邮箱验证失败。检查sql语句。',
                        err 
                    })
                }
            )
         })
    }
}
module.exports = Email;